#include <fstream>
#include <iostream>
#include <vector>

int main(int argc, char** argv) {
  if (argc != 3) {
    std::cerr << "Usage: generate-provider-code in.boc out.h\n";
    return 1;
  }
  std::ifstream in(argv[1], std::ios_base::ate | std::ios_base::binary);
  size_t size = in.tellg();
  in.seekg(0, std::ios::beg);
  std::vector<char> buf(size);
  if (!in.read(buf.data(), size)) {
    std::cerr << "Error: cannot read input\n";
    return 1;
  }
  in.close();

  std::ofstream out(argv[2]);
  out << "// Auto-generated by embed-provider-code\n";
  out << "#pragma once\n";
  out << "const unsigned char STORAGE_PROVIDER_CODE[" << size << "] = {\n  ";
  for (size_t i = 0; i < size; ++i) {
    if (i != 0) {
      out << ",";
      if (i % 32 == 31) {
        out << "\n  ";
      }
    }
    out << (int)(unsigned char)buf[i];
  }
  out << "\n};\n";
  if (!out) {
    std::cerr << "Error: cannot write output\n";
    return 1;
  }
  out.close();
  return 0;
}
